From: Keir Fraser Date: Sat, 24 Nov 2007 13:40:23 +0000 (+0000) Subject: vt-d: Some fixes of Intel iommu X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14710 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=1f0fd2f1a459ce5bd977ce21cb110822141c57a1;p=xen.git vt-d: Some fixes of Intel iommu This patch removes a wrong if condition judgement to setup rmrr identify mapping for guests, and passes page count rather than address size to iommu_flush_iotlb_psi(). Signed-off-by: Weidong Han Signed-off-by: Anthony Xu --- diff --git a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c index 023540a785..4dc4563002 100644 --- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c +++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c @@ -1538,7 +1538,7 @@ int iommu_page_mapping(struct domain *domain, dma_addr_t iova, { iommu = drhd->iommu; if ( cap_caching_mode(iommu->cap) ) - iommu_flush_iotlb_psi(iommu, domain->domain_id, iova, size, 0); + iommu_flush_iotlb_psi(iommu, domain->domain_id, iova, index, 0); else if ( cap_rwbf(iommu->cap) ) iommu_flush_write_buffer(iommu); } @@ -1726,13 +1726,11 @@ static void setup_dom0_rmrr(void) for_each_rmrr_device ( rmrr, pdev ) ret = iommu_prepare_rmrr_dev(dom0, rmrr, pdev); - - if ( ret ) - gdprintk(XENLOG_ERR VTDPREFIX, - "IOMMU: mapping reserved region failed\n"); - + if ( ret ) + gdprintk(XENLOG_ERR VTDPREFIX, + "IOMMU: mapping reserved region failed\n"); end_for_each_rmrr_device ( rmrr, pdev ) - } +} int iommu_setup(void) { @@ -1798,7 +1796,6 @@ int device_assigned(u8 bus, u8 devfn) int assign_device(struct domain *d, u8 bus, u8 devfn) { - struct hvm_iommu *hd = domain_hvm_iommu(d); struct acpi_rmrr_unit *rmrr; struct pci_dev *pdev; int ret = 0; @@ -1813,14 +1810,17 @@ int assign_device(struct domain *d, u8 bus, u8 devfn) reassign_device_ownership(dom0, d, bus, devfn); /* setup rmrr identify mapping just once per domain */ - if ( list_empty(&hd->pdev_list) ) - for_each_rmrr_device(rmrr, pdev) - ret = iommu_prepare_rmrr_dev(d, rmrr, pdev); - if ( ret ) - gdprintk(XENLOG_ERR VTDPREFIX, - "IOMMU: mapping reserved region failed\n"); + for_each_rmrr_device(rmrr, pdev) + ret = iommu_prepare_rmrr_dev(d, rmrr, pdev); + if ( ret ) + { + gdprintk(XENLOG_ERR VTDPREFIX, + "IOMMU: mapping reserved region failed\n"); + return ret; + } end_for_each_rmrr_device(rmrr, pdev) - return ret; + + return ret; } void iommu_set_pgd(struct domain *d)